package com.jzo2o.orders.manager.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jzo2o.api.orders.dto.request.OrderCancelReqDTO;
import com.jzo2o.orders.base.model.domain.Orders;
import com.jzo2o.orders.manager.model.dto.request.OrdersPayReqDTO;
import com.jzo2o.orders.manager.model.dto.request.PlaceOrderReqDTO;
import com.jzo2o.orders.manager.model.dto.response.OrdersPayResDTO;
import com.jzo2o.orders.manager.model.dto.response.PlaceOrderResDTO;

import java.time.LocalDateTime;

/**
 * <p>
 * 下单服务类
 * </p>
 *
 * @author itcast
 * @since 2023-07-10
 */
public interface IOrdersCreateService extends IService<Orders> {


    /**
     * 预约下单
     * @param dto
     * @return
     */
    PlaceOrderResDTO place(PlaceOrderReqDTO dto);

    /**
     * 订单主键Id生成策略 19位：2位年+2位月+2位日+13位序号
     */
     Long generateOrderId();

    void addOrder(Orders orders);

    /**
     * 订单支付
     * @param id
     * @param dto
     * @return
     */
    OrdersPayResDTO pay(Long id, OrdersPayReqDTO dto);

    /**
     * 更新订单
     * @param id
     * @param tradingOrderNo 支付服务交易单号
     * @param tradingChannel 支付渠道
     */
    void updateOrders(Long id, Long tradingOrderNo, String tradingChannel);

    /**
     * 查询订单支付结果
     * @param id
     * @return
     */
    OrdersPayResDTO payResult(Long id);

    /**
     * 支付成功更新订单
     * @param id
     * @param payTime
     * @param transactionId
     */
    void paySuccess(Long id , LocalDateTime payTime, String transactionId);

    /**
     * 取消订单 (待支付和派送中)
     * @param orderCancelReqDTO
     */
    void cancel(OrderCancelReqDTO orderCancelReqDTO);

    /**
     * 取消订单(待支付)
     * @param
     */
    void cancelNoPayUpdate(Long id, String cancelReason, boolean isSystem);

    /**
     * 取消订单(派送中)
     * @param orderCancelReqDTO
     * @param orders
     */
   void cancelOrderByDispatching(OrderCancelReqDTO orderCancelReqDTO, Orders orders);
}
